package Sindarin.Gui;

import javax.swing.*;
import javax.swing.text.*;

/**
 * <p>Company: JavaHispano </p>
 * @author Mart�n P�rez.
 * @version 1.0
 */

public class JTextFieldInteger extends JTextField 
{
        private class FixedSizeFilter extends DocumentFilter {
            int maxSize;
            int min;
            int max;
            boolean ranged;
            JTextField parent;

            public FixedSizeFilter(JTextField parent,int limit) {
                    this.parent = parent;
                maxSize = limit;
            }

            public FixedSizeFilter(JTextField parent,int limit, int min, int max) {
                    this.parent = parent;
                this.maxSize = limit;
                ranged = true;
                this.min = min;
                this.max = max;
            }

            public void insertString(
            DocumentFilter.FilterBypass fb, int offset, String str,
            AttributeSet attr) throws BadLocationException {
                String viejoTexto = fb.getDocument().getText(
                                                                    0, fb.getDocument().getLength());
                replace(fb, offset, 0, str, attr);
                if (ranged) {
                    String texto = fb.getDocument().getText(
                                                                    0, fb.getDocument().getLength());
                    try {
                        int nuevoValor = Integer.parseInt(texto);
                        if ((nuevoValor < min) || (nuevoValor > max)) {
                            fb.getDocument().remove(0,texto.length());
                            fb.getDocument().insertString(0,viejoTexto, attr);
                        }
                    } catch (NumberFormatException nfe) {
                        return;
                    }
                }
            }

            public void replace(DocumentFilter.FilterBypass fb, int offset,
                                                     int length, String str, AttributeSet attrs)
                                                     throws BadLocationException {

                String viejoTexto = fb.getDocument().getText(
                                                                          0, fb.getDocument().getLength());

                try {
                    Integer.parseInt(str);
                } catch (NumberFormatException nfe) {
                    return;
                }
                int newLength = fb.getDocument().getLength()-length+str.length();
                if (newLength <= maxSize) {
                    fb.replace(offset, length, str, attrs);
                    if (ranged) {
                        String texto = fb.getDocument().getText(
                                                                0, fb.getDocument().getLength());
                        try {
                            int nuevoValor = Integer.parseInt(texto);
                            if ((nuevoValor < min) || (nuevoValor > max)) {
                                    if (nuevoValor < min) {
                                            String strMin = ""+min;
                                            if (strMin.startsWith(texto)) {
                                                fb.getDocument().remove(0,texto.length());
                                                fb.getDocument().insertString(0,strMin, attrs);
                                                                        parent.select(strMin.length()-1, strMin.length());
                                                return;
                                            }
                                    }
                                fb.getDocument().remove(0,texto.length());
                                fb.getDocument().insertString(0,viejoTexto, attrs);
                            }
                        } catch (NumberFormatException nfe) {
                            return;
                        }
                    }
                } else {
                    return;
                }
            }
        }


    /**
     * Crea un JTextField que alojar� un n�mero entero de un tama�o fijo. No
     * se permite insertar otro caracter que no sea un entero
     *
     * @param longitud n�mero de d�gitos
     */
    public JTextFieldInteger(int longitud) {

        super();
        AbstractDocument doc = (AbstractDocument)getDocument();
        doc.setDocumentFilter(new FixedSizeFilter(this,longitud));
    }

        /**
     * Crea un JTextField que alojar� un n�mero entero de tama�o 4. No
     * se permite insertar otro caracter que no sea un entero
     *
     */
    public JTextFieldInteger() {

        super();
        AbstractDocument doc = (AbstractDocument)getDocument();
        doc.setDocumentFilter(new FixedSizeFilter(this,4));
    }

    /**
     * Crea un JTextField que alojar� un n�mero entero de un tama�o fijo. No
     * se permite insertar otro caracter que no sea un entero. Adem�s el n�mero
     * s�lo puede pertenecer a un rango de valores especificados por los
     * par�metros min y max
     *
     * @param longitud n�mero de d�gitos
     * @param min M�nimo valor que podr� tener el entero
     * @param max M�ximo valor que podr� tener el entero
     */
    public JTextFieldInteger(int longitud, int min, int max) {

        super();
        AbstractDocument doc = (AbstractDocument)getDocument();
        doc.setDocumentFilter(new FixedSizeFilter(this,longitud,min,max));
    }
}
